package com.browsesoft.dbtools.sqlserver;

import java.io.FileReader;
import java.io.StreamTokenizer;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 代表一个表的数据文件，可以导入到其它数据库中去
 */
public class TableDataFile implements Iterator {
	/**
	 * 读记录时，记录所对应的属性表
	 */
	private Map result = new HashMap();

	/**
	 * 所对应的表结构
	 */
	private TableStruct tableStruct = null;

	/**
	 * 单词解析器，用于读取字段内容
	 */
	private StreamTokenizer parse = null;

	/**
	 * 当前记录
	 */
	private Map record = null;

	/**
	 * 上一次读到的单词
	 */
	private int last = 0;

	/**
	 * 使用文件名构造以及对应的表结构构造
	 */
	public TableDataFile(String fileName, TableStruct tableStruct) {
		this.initTokenParser(fileName);
		this.tableStruct = tableStruct;
	}

	/**
	 * 初始化词法解析器的内容
	 * 
	 * @parma fileName 要解析的文件名
	 */
	private void initTokenParser(String fileName) {
		try {
			// 利用词法解析器
			parse = new StreamTokenizer(new FileReader(fileName));
			// 取消输入的默认类型
			parse.resetSyntax();
			// 设置数字解析能力
			parse.parseNumbers();
			// 把空格和Tab当作空白使用
			parse.whitespaceChars(' ', ' ');
			parse.whitespaceChars('\t', '\t');
			// 设置标识符串
			parse.wordChars('a', 'z');
			parse.wordChars('A', 'Z');
			// 把双引号之间的字符串当作一个字符串
			parse.quoteChar('"');
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 根据条件得到数据
	 * 
	 * @param condition
	 *            条件
	 * @return 数据
	 */
	public Iterator getData(String condition) {
		return this;
	}

	/**
	 * 读取一条记录数据
	 */
	private Map getOneRecord() {
		result.clear();
		// 对于每一个字段
		Iterator iter = this.tableStruct.fields.iterator();
		while (iter.hasNext()) {
			FieldStruct item = (FieldStruct) iter.next();
			// 得到字段值
			String value = this.getFieldValue();
			// 如果没有取到字段值，说明结束
			if (value == null) {
				return null;
			}
			result.put(item.getName(), value);
		}
		return result;
	}

	/**
	 * 从文件中得到一个字段值
	 * 
	 * @return 字段值
	 */
	private String getFieldValue() {
		try {
			// 得到字段类型
			String result = null;
			// 当没有结束时
			while (result == null) {
				int type = parse.nextToken();
				// 如果是结束
				if (type == StreamTokenizer.TT_EOF) {
					return null;
				}
				// 如果是数字
				else if (type == StreamTokenizer.TT_NUMBER) {
					result = Double.toString(parse.nval);
				}
				// 否则，如果是标识符
				else if (type == StreamTokenizer.TT_WORD) {
					result = parse.sval;
				}
				// 否则，如果是字符串
				else if (type == 34) {
					result = parse.sval.trim();
				}
				// 否则，如果上一次是逗号
				else if (this.last == ',') {
					result = "0";
				}
				this.last = type;
			}
			return result;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 看是否有下一个
	 */
	public boolean hasNext() {
		this.record = this.getOneRecord();
		return this.record != null;
	}

	/**
	 * 根据条件得到下一条记录
	 * 
	 * @return 下一条满足条件的记录
	 */
	public Map getOneRecord(String condition) {
		// 对应每一条得到的记录
		Map record = this.getOneRecord();
		while (record != null) {
			// 如果记录满足条件
			if (isTrue(record, condition)) {
				return record;
			}
			record = this.getOneRecord();
		}
		return null;
	}

	/**
	 * 看记录是否满足条件
	 * 
	 * @return
	 */
	private boolean isTrue(Map record, String condition) {
		return true;
	}

	/**
	 * 得到下一个
	 */
	public Object next() {
		return this.record;
	}

	/**
	 * 移走记录
	 */
	public void remove() {
	}
}